package com.sky.service;

import com.sky.dto.AdminUserPageQueryDTO;
import com.sky.dto.LoginDTO;
import com.sky.dto.PageQueryDTO;
import com.sky.entity.Admins;
import com.sky.vo.AdminLoginVO;
import com.sky.vo.AdminUserPageVO;
import cn.mybatis.mp.core.mybatis.mapper.context.Pager;

import java.util.List;

/**
 * @author majun
 * @package com.sky.service
 * @date 2024/11/21 12:55
 */

public interface AdminUserService {

    /**
     * 管理员登录
     *
     * @param loginDTO 登录表单
     * @return adminToken
     */
    AdminLoginVO adminLogin(LoginDTO loginDTO);

    /**
     * 获取管理员全部权限
     *
     * @return 管理员全部权限
     */
    List<String> getPermissionsByAdminId(String adminId);

    /**
     * 获取管理员角色
     *
     * @return 管理员角色
     */
    List<String> getAdminRoles(String adminId);

    /**
     * 获取管理员详细信息
     *
     * @param adminId 管理员ID
     * @return 管理员信息
     */
    Admins getAdminDetails(Integer adminId);

    /**
     * 创建新的管理员账户
     *
     * @param admin   管理员信息对象，包含用户名、密码等信息
     * @param roleIds 要分配的角色ID列表
     */
    void createAdmin(Admins admin, List<Integer> roleIds);

    /**
     * 删除管理员账户
     *
     * @param adminId 要删除的管理员ID
     */
    void deleteAdmin(Integer adminId);

    /**
     * 更新管理员信息
     *
     * @param admin   更新的管理员信息，包含管理员ID和要更新的字段
     * @param roleIds 要更新的角色ID列表
     */
    void updateAdmin(Admins admin, List<Integer> roleIds);

    /**
     * 重置管理员密码
     *
     * @param adminId     管理员ID
     * @param newPassword 新密码
     */
    void resetPassword(Integer adminId, String newPassword);

    /**
     * 分页查询管理员列表
     *
     * @param pager 分页参数对象
     * @param name  搜索关键字（可选）
     * @return 分页结果
     */
    Pager<Admins> pageQuery(PageQueryDTO pager, String name);

    /**
     * 更新管理员账户状态
     *
     * @param adminId 管理员ID
     * @param status  目标状态（0:正常, 1:封禁）
     */
    void updateStatus(Integer adminId, Integer status);

    /**
     * 分页获取管理员账户列表
     *
     * @param queryDTO 查询条件
     * @return 管理员账户分页数据
     */
    Pager<AdminUserPageVO> getAdminUsersPage(AdminUserPageQueryDTO queryDTO);

    /**
     * 获取管理员个人资料
     *
     * @param adminId 管理员ID
     * @return Admins
     */
    Admins getAdminById(Integer adminId);

    /**
     * 更新管理员个人资料
     *
     * @param admin 管理员信息
     */
    void adminUpdateAdmin(Admins admin);

    /**
     * 修改管理员密码
     *
     * @param adminId     管理员ID
     * @param oldPassword 当前密码
     * @param newPassword 新密码
     */
    void updatePassword(Integer adminId, String oldPassword, String newPassword);
}
